package com.yyc.springtransactional.test.controller;

import com.yyc.springtransactional.test.entity.TBusUser;
import com.yyc.springtransactional.test.service.ITBusUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @Description: 用户履历表
 * @Author: 杨艺聪
 * @Date:   2020-06-06
 * @Version: V1.0
 */
@RestController
@RequestMapping("/user")
public class TBusUserController {
	@Autowired
	private ITBusUserService tBusUserService;

	/**
	 * A -> B
	 * A没有事务
	 * B没有事务
	 */
	@PostMapping(value = "/withoutTX")
	public void add() {
		tBusUserService.withoutTX();
	}

	/**
	 * A -> B、
	 * 白话：A有就加入A、A没有就新建
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.REQUIRED)
	 * 如果当前有事务，则加入这个事务，即：A、B共用一个事务
	 * 如果当前没事务，则新建一个事务，即：A没有事务、B有事务
	 */
	@PostMapping(value = "/required")
	public void required() {
		tBusUserService.required();
	}

	/**
	 * A -> B
	 * 白话: 以A为准，A有就都有、A没有就都没有
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.SUPPORTS)
	 * 如果当前有事务，则加入这个事务，即：A、B共用一个事务
	 * 如果当前没事务，则不支持事务，  即：A、B没有事务
	 */
	@PostMapping(value = "/supports")
	public void support() {
		tBusUserService.supports();
	}

	/**
	 * A -> B
	 * 白话: 必须有事务，否则报错
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.mandtory)
	 */
	@PostMapping(value = "/mandtory")
	public void mandtory() {
		tBusUserService.mandtory();
	}


	/**
	 * A -> B
	 * 白话: 不管A有没有事务，B都新建事务
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.REQUIRES_NEW)
	 * 如果当前有事务，则新建一个事务，即：A、B各管个的事务
	 * 如果当前没事务，则新建一个事务，  即：A没有事务，B有事务
	 */
	@PostMapping(value = "/requiresNew")
	public void requiresNew() {
		tBusUserService.requiresNew();
	}

	/**
	 * A -> B
	 * 白话: A有事务就挂起，没有就算了，反正保证B没有事务
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.NOT_SUPPORTED)
	 * 如果当前有事务，则挂起，即：A、B都没有事务
	 * 如果当前没事务，则不管，  即：A事务挂起，B没事务
	 */
	@PostMapping(value = "/notSupport")
	public void notSupport() {
		tBusUserService.notSupport();
	}

	/**
	 * A -> B
	 * 白话: 必须没有事务，否则报错
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.NEVER)
	 */
	@PostMapping(value = "/never")
	public void never() {
		tBusUserService.never();
	}

	/**
	 * A -> B
	 * 白话: A有事务,则B用嵌套事务。A没有事务则B新建任务
	 * A 有事务/没事务
	 * B @Transactional(propagation= Propagation.NESTED)
	 */
	@PostMapping(value = "/nested")
	public void nested() {
		tBusUserService.nested();
	}

	/**
	 * A -> B
	 * A @Transactional()
	 * B 编程式事务 DataSourceTransactionManager
	 */
	@PostMapping(value = "/byHand")
	public void byHand() {
		tBusUserService.byHand();
	}

	/**
	 * A -> B
	 * A 编程式事务 DataSourceTransactionManager
	 * B 编程式事务 DataSourceTransactionManager
	 */
	@PostMapping(value = "/byHand2")
	public void byHand2() {
		tBusUserService.byHand2();
	}

}
